﻿#pragma once
#ifndef WRAPPCONTEXT_H
#define WRAPPCONTEXT_H

#include "WRAppService.h"
#include "../Structs/WRArray.h"
#include <QString>
#include <QLibrary>
#include <QDomElement>

//表示应用程序上下文。
class WRSOFT_UTILITY_CLASS WRAppContext
{
private:
    //表示服务项目。
    class ServiceEntry
    {
    private:
        QUuid m_uuid;
        WRArray<WRAppService*> m_data;

    public:
        //初始化空集合项目 。
        inline ServiceEntry(void)
        {
            //add code here
        }

        //初始化集合项目。
        inline ServiceEntry(const QUuid& uuid, const WRArray<WRAppService*>& data)
            : m_uuid(uuid), m_data(data)
        {
            //add code here
        }

        //复制构造函数。
        inline ServiceEntry(const ServiceEntry& other)
            : m_uuid(other.m_uuid), m_data(other.m_data)
        {
            //add code here
        }
        //赋值操作符。
        inline ServiceEntry& operator=(const ServiceEntry& other)
        {
            if (&other != this)
            {
                m_uuid = other.m_uuid;
                m_data = other.m_data;
            }
            return *this;
        }

        //获取标识。
        inline const QUuid& uuid(void) const
        {
            return m_uuid;
        }
        //获取数据。
        inline const WRArray<WRAppService*>& data(void) const
        {
            return m_data;
        }

        //获取数据对象数量。
        inline WRu count(void) const
        {
            return m_data.count();
        }
        //获取指定索引的数据对象。
        inline WRAppService* index(WRu i) const
        {
            return m_data[i];
        }
    };

    WRArray<QLibrary*> m_modules;
    WRArray<WRAppService*> m_services;
    WRArray<ServiceEntry> m_serviceHash;

    Q_DISABLE_COPY(WRAppContext)

    //初始化模块。
    void initModules(const QDomElement& config);
    //初始化服务。
    void initServices(const QDomElement& config);

    //初始化上下文实例。
    WRAppContext(void);
    //清理当前对象所占用的相关资源。
    ~WRAppContext(void);

public:
    //获取应用程序上下文唯一实例。
    static WRAppContext* current(void);

    //执行相应的初始化处理。
    void initialize(const QDomElement& config);
    //执行相应的初始化处理。
    void initialize(const QString& configFileName);

    //获取指定类型的服务。
    WRAppService* getService(const QUuid& tuid);
    //获取指定类型的服务。
    inline WRAppService* getService(WRType* type)
    {
        return getService(type->uuid());
    }

    //获取指定类型的所有服务。
    const WRArray<WRAppService*>& getAllServices(const QUuid& tuid);
    //获取指定类型的所有服务。
    inline const WRArray<WRAppService*>& getAllServices(WRType* type = 0)
    {
        if (!type)
        {
            return getAllServices(QUuid());
        }
        return getAllServices(type->uuid());
    }
};

#endif // WRAPPCONTEXT_H
